package com.xutianpeng.disk.user.repository;

import com.xutianpeng.disk.mybatis.entity.PtUserEntity;
import com.xutianpeng.disk.mybatis.flexigrid.PagingEntity;
import com.xutianpeng.disk.mybatis.ztree.ZtreeEntity;
import com.xutianpeng.disk.user.entity.SearchUserEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户数据访问层接口，负责用户相关数据库操作
 */
@Mapper
public interface UserDao {
    List<PtUserEntity> queryUserList();

    /**
     * 批量逻辑删除用户（更新删除标识）
     * @param idArray 用户UUID数组
     */
    void deleteUserByIds(@Param("ids") String[] idArray);

    /**
     * 单个逻辑删除用户（更新删除标识）
     * @param id 用户UUID
     */
    void deleteUserById(@Param("id") String id);

    /**
     * 分页查询用户列表
     * @param entity 搜索条件实体
     * @param paging 分页参数实体
     * @return 分页用户列表
     */
    List<PtUserEntity> queryUserInfoListByPage(
            @Param("entity") SearchUserEntity entity,
            @Param("paging") PagingEntity paging
    );

    /**
     * 查询符合条件的用户总数量（用于分页计算）
     * @param entity 搜索条件实体
     * @return 用户总数量
     */
    Integer queryUserTotal(@Param("entity") SearchUserEntity entity);

    /**
     * 根据用户UUID查询用户详情
     * @param userUuid 用户UUID
     * @return 用户实体
     */
    PtUserEntity queryUserInfoById(@Param("userUuid") String userUuid);

    /**
     * 修改用户基本信息
     * @param entity 包含更新信息的用户实体
     */
    void modifyUserInfoById(@Param("entity") PtUserEntity entity);

    /**
     * 根据邮箱查询用户（用于唯一性校验）
     * @param entity 包含邮箱信息的用户实体
     * @return 符合条件的用户列表
     */
    List<PtUserEntity> queryUserInfoByEmail(@Param("entity") PtUserEntity entity);

    /**
     * 根据手机号码查询用户（用于唯一性校验）
     * @param entity 包含手机号码的用户实体
     * @return 符合条件的用户列表
     */
    List<PtUserEntity> queryUserInfoByMobile(@Param("entity") PtUserEntity entity);

    /**
     * 根据用户名查询用户（用于唯一性校验）
     * @param entity 包含用户名的用户实体
     * @return 符合条件的用户列表
     */
    List<PtUserEntity> queryUserInfoByUserName(@Param("entity") PtUserEntity entity);

    /**
     * 新增用户信息
     * @param entity 包含用户信息的实体
     */
    void addUserInfo(@Param("entity") PtUserEntity entity);

    /**
     * 查询用户关联的角色名称（用于删除校验）
     * @param id 用户UUID
     * @return 角色名称（存在关联时）
     */
    String queryRoleListByUser(@Param("id") String id);

    /**
     * 查询所有角色列表（用于角色树展示）
     * @return 角色树实体列表
     */
    List<ZtreeEntity> queryRoleTreeList();

    /**
     * 删除用户与所有角色的关联关系
     * @param userUuid 用户UUID
     */
    void deleteRoleByUser(@Param("userUuid") String userUuid);

    /**
     * 建立用户与角色的关联关系
     * @param userUuid 用户UUID
     * @param roleUuid 角色UUID
     */
    void insertRoleRefUser(
            @Param("userUuid") String userUuid,
            @Param("roleUuid") String roleUuid
    );

    /**
     * 查询用户关联的所有角色UUID
     * @param userUuid 用户UUID
     * @return 角色UUID列表
     */
    List<String> queryRoleByUser(@Param("userUuid") String userUuid);

    /**
     * 根据用户名查询用户
     * @param currentUsername
     * @return
     */
    PtUserEntity selectByUsername(@Param("username") String currentUsername);

    /**
     * 重置用户密码（置空）并标记需要重置
     * @param userUuids 用户UUID数组
     */
    void resetPasswords(@Param("userUuids") String[] userUuids);

    /**
     * 更新用户密码
     * @param userUuid 用户UUID
     * @param newPassword 新密码（已加密）
     * @param needResetPwd 是否需要继续重置
     */
    void updatePassword(
            @Param("userUuid") String userUuid,
            @Param("newPassword") String newPassword,
            @Param("needResetPwd") Integer needResetPwd
    );

    /**
     * 查询所有未删除的用户列表
     * @return 用户实体列表
     */

}